from src.compiler.Lexer.lexer import Lexer
from src.compiler.Parser.parser import *
from src.compiler.Semantic.semantic import SemanticAnalyzer

class SQLCompiler:
    def __init__(self):
        # 在初始化时，就准备好所有需要的组件
        self.lexer = None
        self.tokens=None
        self.parser = None
        self.analyzer = SemanticAnalyzer()
        self.symbol_table_cache = {}


    def compile(self, sql_string: str):
        """
        完整编译SQL字符串，从词法分析到语义分析。
        返回 (quadruples, error_message)
        """
        try:
            # 1. 词法分析
            self.lexer = Lexer(sql_string)
            tokens = self.lexer.tokenize()
            if not tokens:
                return None, "词法分析失败：无法解析输入。"

            # 2. 语法分析
            self.parser = PredictiveParser(tokens)
            ast,output = self.parser.parse()
            print("ast:",ast)
            if not ast:
                 return None, "语法分析失败：SQL语句结构错误。"

            # 3. 语义分析
            quadruples, updated_symbol_table = self.analyzer.analyze(ast, self.symbol_table_cache)
            self.symbol_table_cache = updated_symbol_table
            print("ast:", ast)
            if quadruples is None:
                print("ast:", ast)
                return None, "语义分析失败，请检查上方控制台输出的具体错误。"
            return quadruples, None
        except Exception as e:
            return None, f"编译时发生未知错误: {e}"